package com.gao.transportapi.config;

import com.gao.transportapi.aspect.interceptor.TokenInterceptor;
import com.gao.transportapi.common.json.JacksonObjectMapper;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.util.pattern.PathPatternParser;

import java.util.List;

/**
 * Web MVC配置类
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Resource
    private TokenInterceptor tokenInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册token拦截器
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns(
                        "/swagger-ui/**",
                        "/swagger-resources/**",
                        "/v3/api-docs/**",
                        "/doc.html",
                        "/webjars/**",
                        "/favicon.ico"
                        // 根据需要添加更多不需要验证的路径
                );
    }
    
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // 使用PathPatternParser，它提供了更好的路径匹配能力
        configurer.setPatternParser(new PathPatternParser());
        
        // 设置路径匹配的优先级：
        // 1. 精确路径匹配优先于模式匹配
        // 2. 更具体的模式优先于不太具体的模式
        // 这将确保/accounts的请求会优先由AccountController处理
        configurer.setUseTrailingSlashMatch(false); // 关闭尾部斜杠匹配
    }
    
    /**
     * 扩展消息转换器，使用自定义的JacksonObjectMapper
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 创建消息转换器
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        // 设置对象转换器，底层使用Jackson将Java对象转为json
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        // 将上面的消息转换器对象添加到converters集合中
        converters.add(0, messageConverter); // 添加到第一个位置，优先使用我们的转换器
    }
} 